package org.dmcs.homework.statistics;

import java.lang.reflect.Array;

import Jama.Matrix;

/**
 * Narzedzie do szybkiego wyswietlania danych tablicowych i macierzowych na potrzeby
 * testów. 
 */
public class CollectionPrinter {
	/**
	 * Prints the <code>data</code> matrix to the <code>System.out</code> stream.
	 * @param data the matrix to be printed.
	 */
	public void printMatrix(Matrix data) {
		
		for(int i=0; i<data.getRowDimension(); i++) {
			/*
			 * Rozpoczecie rzedu macierzy.
			 */
			System.out.print("[");
			
			for(int j=0;j<data.getColumnDimension();j++) {
				/*
				 * Wypisanie elementu.
				 */
				System.out.print(data.get(i, j));
				
				/*
				 * Rozdzielanie elementów przecinkami. 
				 */
				if(j != data.getColumnDimension()-1) {
					System.out.print(", ");
				}
			}
			
			/*
			 * Zamkniecie rzedu macierzy.
			 */
			System.out.println("]");
		}
	}
	
	
	
	/**
	 * Print an array of arbitrary values into the console.
	 * @param array the array to be printed out.
	 */
	public void printArray(Object array) {
		/*
		 * Null jest wypisywany jako tekst.
		 */
		if(array == null) {
			System.out.println(array);
			return;
		}
		else if( !array.getClass().isArray()) {
			/*
			 * Wejscie niebedace tablica powoduje wyjatek.
			 */
			throw new IllegalArgumentException("CollectionPrinter|printArray|"
					+ "the input is not an array");
		}
		
		/*
		 * Otwarcie tablicy.
		 */
		System.out.print("\n[");
		
		/*
		 * Dlugosc tablicy.
		 */
		int length = Array.getLength(array);

		/*
		 * i-ta wartosc z tablicy.
		 */
		Object iValue;
		
		for(int i=0; i<length; i++) {
			/*
			 * Odczyt i-tego elementu.
			 */
			iValue = Array.get(array, i);
			
			/*
			 * Null wypisywany jako tekst.
			 */
			if(iValue == null) {
				System.out.print(iValue);
			}
			/*
			 * Rekursywne wypisywanie tablic zagniezdzonych.
			 */
			else if(iValue.getClass().isArray()) {
				printArray(iValue);
			}
			/*
			 * Dla pozostalych elementow, wypisywanie wprost.
			 */
			else {
				System.out.print(iValue);
			}

			/*
			 * Rozdzielanie elementow przecinkami.
			 */
			if(i != (length-1)) {
				System.out.print(", ");
			}
		}
		
		/*
		 * Zamkniecie tablicy.
		 */
		System.out.println("]");
	}
}